package com.luyuan.common.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectResult;
import com.luyuan.common.config.OssProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * 阿里云OSS工具类
 *
 * @author luyuan
 */
@Component
public class OssUtils {

    private static final Logger log = LoggerFactory.getLogger(OssUtils.class);

    private static OSS ossClient;

    private static OssProperties ossProperties;

    @Autowired
    public void setOssClient(OSS ossClient) {
        OssUtils.ossClient = ossClient;
    }

    @Autowired
    public void setOssProperties(OssProperties ossProperties) {
        OssUtils.ossProperties = ossProperties;
    }

    /**
     * 上传文件到OSS
     *
     * @param file 文件
     * @return 文件访问URL
     */
    public static String uploadFile(MultipartFile file) {
        try {
            // 获取文件名
            String originalFilename = file.getOriginalFilename();
            // 生成新的文件名
            String fileName = generateFileName(originalFilename);
            
            // 上传文件到OSS
            PutObjectResult result = ossClient.putObject(
                    ossProperties.getBucketName(),
                    ossProperties.getDir() + "/" + fileName,
                    file.getInputStream());

            if (result != null) {
                // 返回文件访问URL
                return ossProperties.getDomain() + "/" + ossProperties.getDir() + "/" + fileName;
            }
        } catch (OSSException oe) {
            log.error("OSS上传文件异常，错误码：{}，错误信息：{}", oe.getErrorCode(), oe.getMessage());
        } catch (Exception e) {
            log.error("上传文件到OSS异常：", e);
        }
        return null;
    }

    /**
     * 上传文件到OSS
     *
     * @param fileName 文件名
     * @param bytes 文件字节数组
     * @return 文件访问URL
     */
    public static String uploadFile(String fileName, byte[] bytes) {
        try {
            // 生成新的文件名
            fileName = generateFileName(fileName);
            
            // 上传文件到OSS
            PutObjectResult result = ossClient.putObject(
                    ossProperties.getBucketName(),
                    ossProperties.getDir() + "/" + fileName,
                    new ByteArrayInputStream(bytes));

            if (result != null) {
                // 返回文件访问URL
                return ossProperties.getDomain() + "/" + ossProperties.getDir() + "/" + fileName;
            }
        } catch (OSSException oe) {
            log.error("OSS上传文件异常，错误码：{}，错误信息：{}", oe.getErrorCode(), oe.getMessage());
        } catch (Exception e) {
            log.error("上传文件到OSS异常：", e);
        }
        return null;
    }

    /**
     * 上传文件到OSS
     *
     * @param fileName 文件名
     * @param inputStream 文件输入流
     * @return 文件访问URL
     */
    public static String uploadFile(String fileName, InputStream inputStream) {
        try {
            // 生成新的文件名
            fileName = generateFileName(fileName);
            
            // 上传文件到OSS
            PutObjectResult result = ossClient.putObject(
                    ossProperties.getBucketName(),
                    ossProperties.getDir() + "/" + fileName,
                    inputStream);

            if (result != null) {
                // 返回文件访问URL
                return ossProperties.getDomain() + "/" + ossProperties.getDir() + "/" + fileName;
            }
        } catch (OSSException oe) {
            log.error("OSS上传文件异常，错误码：{}，错误信息：{}", oe.getErrorCode(), oe.getMessage());
        } catch (Exception e) {
            log.error("上传文件到OSS异常：", e);
        }
        return null;
    }

    /**
     * 删除OSS上的文件
     *
     * @param fileName 文件名
     * @return 是否删除成功
     */
    public static boolean deleteFile(String fileName) {
        try {
            ossClient.deleteObject(ossProperties.getBucketName(), ossProperties.getDir() + "/" + fileName);
            return true;
        } catch (OSSException oe) {
            log.error("OSS删除文件异常，错误码：{}，错误信息：{}", oe.getErrorCode(), oe.getMessage());
        } catch (Exception e) {
            log.error("删除OSS文件异常：", e);
        }
        return false;
    }

    /**
     * 生成文件名
     *
     * @param originalFilename 原始文件名
     * @return 新文件名
     */
    private static String generateFileName(String originalFilename) {
        // 获取文件扩展名
        String extension = "";
        if (originalFilename != null && originalFilename.lastIndexOf(".") != -1) {
            extension = originalFilename.substring(originalFilename.lastIndexOf("."));
        }
        
        // 生成新的文件名：日期路径 + UUID + 扩展名
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        String datePath = sdf.format(new Date());
        return datePath + "/" + UUID.randomUUID().toString().replaceAll("-", "") + extension;
    }
}